LinuC-2 - 201試験 - 2.01:システムの起動とLinuxカーネル - 2.01.4 Linuxカーネルのコンパイル

Last Update : January 02 2021 16:07:28

     

a. Linuxカーネルのコンパイル

カーネルをコンパイルする手順は以下のようです。

  1. カーネルソースを用意する
  2. カーネルコンフィギュレーションを設定する
  3. カーネルをコンパイルする
  4. カーネルモジュールをコンパイルする
  5. カーネルとカーネルモジュールを配置する
  6. ブートローダの設定を変更する
1.カーネルソースを用意する

最新のカーネルソースは、http://www.kernel.orgから入手します。
取得したカーネルソースを/usr/src以下に展開します。
カーネルソースコードの場所は一般的には /usr/src/linux-バージョン、  Red HatやCentOSでは/usr/src/kernelsディレクトリ以下。
 LinuCでは/usr/src/linuxとしている。

# cd /usr/src # wget ftp://ftp.kernel.org/pub/linux/kernel/v2.6/linux-2.6.20.7.tar.gz # tar xzf /usr/src/linux-2.6.20.7.tar.gz # cd /usr/src/linux-2.6.20.7

● カーネルソース格納ディレクトリ(usr/src/linux)の構造
 ディレクトリ名  説明
 archアーキテクチャに依存したコード
 configs目的別の.configファイル
 crypto暗号処理関数
 drivers各種デバイスドライバ関連
 fs仮想ファイルシステムと各種ファイルシステム関連
 includeC言語のインクルードファイル
 init初期化コード
 ipcSystemV互換プロセス間通信関連(共有メモリ、セマフォなど)
 kernel主要なカーネル機能
 lib各種モジュール関連
 mmメモリ管理関連
 net各種ネットワークプロトコル関連
 scriptsカーネル作成支援スクリプト
 Documentation各種ドキュメント
 net各種ネットワークプロトコル関連

 ファイル名  説明
 .configカーネルの設定ファイル
 MakefileカーネルのMakefile


2.カーネルコンフィギュレーションを設定する

カーネルのコンフィグレーションファイル.configを生成し、関連ファイルを設定します。
設定変更を目的として同一ディレクトリで作業をする場合は、.configファイルのバックアップをとっておきます。

$ mv /usr/src/linux-2.6.20.7/.config /usr/src/linux-2.6.20.7/.config.bak

"make mrproper" でカーネルソースを初期化します。
現在のコンフィグレーションファイル.configと、前回のカーネルコンフィグレーションで生成されたすべてのファイルを削除して初期状態に戻します。

$ make mrproper

現カーネルのコンフィグを新カーネルへ引き継ぎます。現カーネルのコンフィグ(.config)を引き継ぎ、新カーネルへ差分を取り出して設定するには "make oldconfig" します。
現在稼動中の設定を反映したい場合は、現在の.config を適宜持ってきてmake oldconfigを実行します。
※make oldconfig は現行の設定を引き継ぎつつ、追加になった設定のみを行う為のコマンドです。

$ cp /boot/config-2.6.18-194.26.1.el5 .config $ make oldconfig

ここから先は対話形式で進みます。
"y"はカーネルに静的に組み込まれます。
"m"はカーネルモジュールとして組み込まれます。(使用時のみ動作します)
  "n"は設定を無効化します。
  "?"でヘルプを参照します。

さらに設定を変更する場合は、
make config、make menuconfig、make xconfig、make gconfig、make defconfigのコマンドを使用して設定を変更します。
config:設定項目1つ1つについて、順番に対話的に尋ねてくる、最もシンプルな形式です。
menuconfig:cursesライブラリを利用した、端末ベースのメニュー形式のインターフェイスです。
xconfig:QtベースのGUIツールです。
gconfig:GtkベースのGUIツールです。
defconfig:arch/$ARCH/defconfigをデフォルトとして、.configを生成します。

・カーネルの設定は/usr/src/linux/.configファイルに記録される
・make oldconfigで現在のコンフィグに新しい設定を反映する。
 カーネルのバージョンアップ時以外は利用しない。

3.カーネルをコンパイルする

カーネルをコンパイルするには、make bzImage を実行します。

# make bzImage

カーネルのコンパイルは、make zImage と make bzImage のどちらでもコンパイルできるが、zImageには、メモリ制限があるため大きなサイズのカーネルを作成するとエラーになってしまいます。そのため、最近ではbzImageを使います。


4.カーネルモジュールをコンパイルする

カーネルモジュールはカーネルにあったものが必要なので、カーネルモジュールもコンパイルします。

# make modules

make をパラメータなしで実行するとカーネルとカーネルモジュールの両方のコンパイルが行われます。

5.カーネルとカーネルモジュールを配置する

カーネルとカーネルモジュールと必要ファイルを適切なディレクトリにインストールします。

# make modules-install # make install

make installで実行されること
・カーネルを/boot以下に、バージョンをファイル名に付加してコピーする
・初期RAMディスクが必要な場合は作成する>
・ブートローダーの設定ファイルに新しいカーネル用のエントリを追加する

make installが実行出来ない場合別途手作業での作業が必要となる。

[make installが実行できない場合]
・手作業でのカーネルのインストール

  • 手作業でカーネルイメージの配置、初期RAMディスクの作成、ブートローダの設定を行う
  • (作業ディレクトリ)/arch/(アーキテクチャ)boot/にカーネルイメージがあるので、このファイルを「vmlinuz」にリネームして/bootに配置する
  • 同時に、「System.map」も/bootに配置する
# cp /usr/src/linux/arch/x86/boot/bzImage /boot/vmlinuz-2.6.27 # cp /usr/src/linux/System.map /boot/System.map-2.6.27 # ln -s /boot/vmlinuz-2.6.27 /boot/vmlinuz # ln -s /boot/System.map-2.6.27 /boot/System.map

System.mapファイルは、カーネルのメモリアドレスとシンボルとのマッピングが記述されている。シンボル一覧は/proc/ksyms , /proc/kallsymsで確認ができる

● カーネルイメージの配置
多くのディストリビューションでは、以下のコマンドでカーネルイメージとSystem.mapをインストール可能

# installkernel 2.6.18-6-686 arch/x86/boot/bzImage System.map

【 初期RAMディスクの作成 】

システム起動時に必要な機能をカーネルモジュールとした場合は、初期RAMディスクが必要になります。
・ファイルとして用意されているファイルシステムをRAMディスクとしてメモリ上に展開して、それを暫定的なルートファイルとしてカーネルを起動します。この起動用のRAMディスクを初期RAMディスクといいます。
・初期RAMディスクで暫定的にカーネルを起動させ、その後実際のカーネルを起動させることができます。
・初期RAMディスクには、gzipで圧縮したファイルシステムイメージファイルであるinitrdと、gzipで圧縮しcpioアーカイブであるinitramfsがあり、それぞれmkinitrdコマンド、mkinitramfsコマンドで作成します。

 
# mkinitramfs -0 /boot/innitrd.img-2.6.27 2.6.27

初期RAMディスクを作成するコマンドは以下の2通り
1. mkinitrd RAMディスクイメージファイル名 カーネルバージョン
2. mkinitramfs -o RAMディスクイメージファイル名 カーネルバージョン

1. はファイルシステムイメージを圧縮
2.はcpioアーカイブを圧縮

という違いがある。mkinitramfsは-oオプションが必要なことに注意。
カーネル2.6.* では通常 2. mkinitramfs を利用する、とのこと。

展開して内容を確認する手順もメモ。
1.圧縮したイメージファイルを適当なディレクトリにコピーして、gunzipなどで解凍。
2.更に適当なディレクトリを作成して、移動する。
3.# cat RAMディスクイメージファイル名 | cpio -id で展開する。


6.ブートローダの設定を変更する

・ブートローダの設定変更
-> 新しいカーネルで起動できるようにブートローダに新しいエントリを追加する
-> 新しいカーネルで問題が発生しないことを確認できるまでは前のエントリは残しておく
●GRUBの例

# vi /boot/grub/menu.lst
 title Linux-2.6.27   root (0,0)   kernel /vmlinuz-2.6.27 root=/dev/sda1 ro   initrd /initrd-2.6.27.img
●LILOの例
# vi/etc/lilo.conf
 image=/boot/vmlinuz-2.6.27  label=Linux-2.6.27   initrd /boot/initrd-2.6.27.img   read-only   root=/dev/sda1 ro

● makeオプション
 clean.config以外の不要なファイルを削除する
 mrproperカーネルソースツリーを初期化する
.configやバックアップファイルも含めて不要なファイルを削除する
 distclean上記に加えてpatchが作成したファイルも削除する
 defconfigデフォルト値を設定した.configを作成する
 allすべてのビルドを実施
 modules動的なモジュールをすべてビルドする
 rpmカーネルビルド後にRPMパッケージを作成する
 rpm-pkgソースRPMパッケージを作成する
 binrpm-pkgビルド済みカーネルとモジュールのRPMパッケージを作成
 deb-pkgビルド済みカーネルとモジュールのDebianパッケージを作成

z. 出題範囲概要

概要 :
  • Linuxカーネルの特定の機能を必要に応じて取り込んだり無効化するために、カーネルを適切に構成できる。また、必要に応じてLinuxカーネルをコンパイルし、新しいカーネルに変更点を書き込み、initrdイメージを作成し、新しいカーネルをインストールできる。

詳細 :
  • /usr/src/linux/
    /usr/src/linux/.config
  • カーネルの Makefile
  • Kernel 2.6.x、3.x、4.x、5.x のmakeのターゲット。
    all, config, xconfig, menuconfig, gconfig, oldconfig, mrproper, bzImage, modules, modules_install, rpm-pkg, binrpm-pkg, deb-pkg
  • カーネル構成をカスタマイズする。
  • 新しいカーネルおよび適切なカーネルモジュールを構築する。
    /lib/modules/kernel-version/, gzip, bzip2
  • 新しいカーネルおよび必要なモジュールをインストールする。
    module tools, depmod
  • ブートマネージャが新しいカーネルおよび関連付けられたファイルを探せるようにする。
  • モジュールの構成ファイル
  • DKMS を使用してカーネルのモジュールをコンパイルする。
    dkms
  • initrd を構成する。
    Dracut,mkinitrd, mkinitramfs

  [ 例題 ] 


         

    www.it-shikaku.jp